/* 
 * AgendaBO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.business.impl;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IAgendaBO;
import br.com.pma.chamatec.dao.AgendaDAO;
import br.com.pma.chamatec.dao.ChamadoDAO;
import br.com.pma.chamatec.dominio.TipoSituacao;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Agenda;
import br.com.pma.entity.Chamado;

/**
 * Interface de negócio da entidade Agenda.
 *
 * @author Ludemeula Fernandes de Sá
 */
@Stateless
public class AgendaBO implements IAgendaBO {

	@Inject
	private AgendaDAO agendaDAO;

	@Inject
	private ChamadoDAO chamadoDAO;

	/**
	 * @see br.com.pma.chamatec.business.IAgendaBO#salvar(br.com.pma.entity.Agenda)
	 */
	@Override
	public Agenda salvar(Agenda agenda) throws ChamatecNegocioException {
		validaCamposObrigatorios(agenda);
		
		/*Date dataAtual = new Date();
		
		if (agenda.getDataInicio().getTime() < dataAtual.getTime()) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_020);
		}

		if (agenda.getDataFim().getTime() < agenda.getDataInicio().getTime()) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_021);
		}*/
		
		agenda = agendaDAO.merge(agenda);
		Chamado chamado = agenda.getChamado();
		chamado.setIsAgendado(TipoSituacao.AGENDADO.getCodigo());
		chamado.setStatus(TipoSituacao.AGENDADO.getDescricao());

		persitirEstadoChamado(chamado);
		return agenda;
	}

	/**
	 * @see br.com.pma.chamatec.business.IAgendaBO#remover(br.com.pma.entity.Agenda)
	 */
	@Override
	public void remover(Agenda agenda) throws ChamatecNegocioException {
		agendaDAO.remove(agenda);

		Chamado chamado = agenda.getChamado();

		desfazVinculo(chamado);
		persitirEstadoChamado(chamado);
	}

	/**
	 * @see br.com.pma.chamatec.business.IAgendaBO#pesquisar()
	 */
	@Override
	public List<Agenda> pesquisar() throws ChamatecNegocioException {
		List<Agenda> retorno = agendaDAO.pesquisar();
		if (retorno == null || retorno.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return retorno;
	}

	/**
	 * Realiza a validação dos campos obrigatórios.
	 * 
	 * @param agenda
	 * @throws ChamatecNegocioException
	 */
	private void validaCamposObrigatorios(Agenda agenda) throws ChamatecNegocioException {
		if (agenda.getChamado() == null || agenda.getChamado().getResumo() == null || agenda.getChamado().getResumo().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (agenda.getHorarioAgendamento() == null || agenda.getHorarioAgendamento().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (agenda.getEndereco() == null || agenda.getEndereco().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}
	}

	/**
	 * Salva o estado de 'agendado' no registro do Chamado.
	 * 
	 * @return
	 */
	private Chamado persitirEstadoChamado(Chamado chamado) {
		chamado = chamadoDAO.merge(chamado);
		return chamado;
	}

	/**
	 * Salva o estado de 'agendado' no registro do Chamado.
	 * 
	 * @return
	 */
	private Chamado desfazVinculo(Chamado chamado) {
		chamado.setIsAgendado(0L);
		chamado.setStatus(TipoSituacao.AUTORIZADO.getDescricao());

		return chamado;
	}
}